// liente.h: interface for the Cliente class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_LIENTE_H__53E4E58A_1247_4B01_9803_E6E42BF78850__INCLUDED_)
#define AFX_LIENTE_H__53E4E58A_1247_4B01_9803_E6E42BF78850__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#include "..\common\Sockets\CNodeClient.h"
#include "..\common\figuras\sdlHelper.h"
#include <string>
#include "..\common\codigoServerCliente.h"
#include "..\common\codigoClienteServer.h"
#include "..\common\escenario.h"
#include "HandlerSincronizacion.h"
#include "HandlerGraficar.h"
#include "HandlerImagenes.h"
#include "HandlerStart.h"
#include "HandlerEnd.h"
#include "Receiver.h"
#include "Sender.h"
#include "Nivel.h"
#include "..\common\figuras\textura.h"
#include <list>
#include "..\common\types.h"
#include "..\common\thread.h"
#include "..\common\figuras\pantalla.h"
#include "..\common\EnumMovimiento.h"


class Cliente : public thread
{
public:
	Cliente(int puerto, std::string ip);
	virtual ~Cliente();

	void conectar();

	virtual void run();

	Nivel* getNivelActual() {
		return this->nivelActual;
	}

	void setNivelActual(Nivel* nivel) {
		this->nivelActual = nivel;
	}

	pad* getPad1(){
		return jugador1;
	}

	pad* getPad2(){
		return jugador2;
	}

	tejo* getTejo(){
		return Tejo;
	}


	bool isEnd() {
		return end;
	}

	void setEnd(bool value) {
		this->end = value;
	}

	bool isLoading() {
		return loading;
	}

	void setLoading(bool value) {
		this->loading = value;
	}

	bool isSincronized() {
		return sincronized;
	}

	void setSincronized(bool sincro) {
		this->sincronized = sincro;
	}

	void agregarTextura(textura* tex);

	void empezarNuevoNivel();
	void setNuevoNivel(Nivel* nivel);

	void graficar();

	void mandarEventoTeclado(EnumMovimiento movimiento);

	CNodeClient& getSocketClient(){
		return socketClient;
	}

	void setPuntaje1(int puntaje){
		this->puntaje1 = puntaje;
	}

	void setPuntaje2(int puntaje){
		this->puntaje2 = puntaje;
	}

	
	void setPosBonus(int pos){
		this->posicion_bonus = pos;
	}

	void setTipoBonus(int tb){
		this->tipo_bonus = tb;
	}

	void setEstadoBonus(int estado){
		this->estadoBonus = estado;
	}

	void mostrarUltimaPantalla(int puntaje1, int puntaje2);

private:

	CNodeClient socketClient;

	MapObservers fromServerHandlers;
	
	Receiver* receiver;
	Sender* sender;

	Nivel* nivelActual;

	std::list<textura*>* listaTex;

	bool sincronized;
	bool end;
	bool loading;

	pad* jugador1;
	pad* jugador2;
	tejo* Tejo;
	color* colorAnterior;


	textura* textura_bonus;

	int posicion_bonus;
	int tipo_bonus;
	int estadoBonus,estadoBonusAnterior;

	int puntaje1,puntaje2;

	void initHandlers();

};

#endif // !defined(AFX_LIENTE_H__53E4E58A_1247_4B01_9803_E6E42BF78850__INCLUDED_)
